package com.zc.controller;

import com.zc.common.Result;
import com.zc.dto.ClassExamStatsDTO;
import com.zc.exception.CustomerException;
import com.zc.service.ExamStatisticsService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author zc
 * @Date 2025/8/22
 * @apiNote 考试分析控制器，包含班级成绩统计功能
 */
@RestController
@RequestMapping("/fenxi")
public class FenXiController {
    @Resource
    ExamStatisticsService examStatisticsService;

    @GetMapping("/getAll")
    public Result getClassStats(
            @RequestParam(required = false) Integer selectedExam,
            @RequestParam(required = false) Integer specifiedScore,
            @RequestParam(required = false) Integer excellentScore,
            @RequestParam(required = false) Integer passScore,
            @RequestParam(required = false) String firstClassName,
            @RequestParam(required = false) String finallyClassName) {

        if (selectedExam == null) {
            throw new CustomerException("请选择考试");
        }
        // 1. 获取所有班级的统计数据
        List<ClassExamStatsDTO> result = examStatisticsService.getClassStatsForExam(
                selectedExam, specifiedScore, excellentScore, passScore);

        // 2. 解析起始班级和结束班级的数字值
        Integer start = parseClassNumber(firstClassName);
        Integer end = parseClassNumber(finallyClassName);

        // 3. 过滤出在班级范围内的数据
        List<ClassExamStatsDTO> filteredStats = new ArrayList<>();
        for (ClassExamStatsDTO stats : result) {
            Integer classNumber = parseClassNumber(stats.getClassName());
            if (classNumber != null && isInRange(classNumber, start, end)) {
                filteredStats.add(stats);
            }
        }

        // 直接返回过滤后的数据，不计算排名
        return Result.success(filteredStats);
    }

    /**
     * 解析班级名称中的数字部分
     * @param className 班级名称（如"717"、"717班"、"七年17班"等）
     * @return 班级数字，解析失败返回null
     */
    private Integer parseClassNumber(String className) {
        if (className == null || className.trim().isEmpty()) {
            return null;
        }

        // 使用正则表达式提取数字
        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(className);

        if (matcher.find()) {
            try {
                return Integer.parseInt(matcher.group());
            } catch (NumberFormatException e) {
                return null;
            }
        }
        return null;
    }

    /**
     * 判断班级号是否在指定范围内
     * @param classNumber 班级号
     * @param start 起始班级（null表示不限制下限）
     * @param end 结束班级（null表示不限制上限）
     * @return 是否在范围内
     */
    private boolean isInRange(Integer classNumber, Integer start, Integer end) {
        // 处理起始班级为null的情况（不限制下限）
        boolean aboveStart = (start == null) || (classNumber >= start);
        // 处理结束班级为null的情况（不限制上限）
        boolean belowEnd = (end == null) || (classNumber <= end);

        return aboveStart && belowEnd;
    }
}
